package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import com.sisgesbyte.services.proyeccion.ProyeccionCategoriaProductoService;
import com.sisgesbyte.services.proyeccion.bean.AvanceCategoriaProductoBean;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyCategoriaProdResponse;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;

@ManagedBean
@ViewScoped
public class ProyeccionCategoriasProductosMBean implements Serializable {

	private static final long serialVersionUID = 1L;
	@EJB
	private ProyeccionCategoriaProductoService proyeccionCategoriaProductoService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	private List<AvanceCategoriaProductoBean> listaAvanceCategoriaProductos;
	private TreeNode selectedNode;
	private TreeNode root;
	private TreeNode[] node;
    private List<AvanceCategoriaProductoBean> listaCategoriaPadres ;
    private List<AvanceCategoriaProductoBean> listaCategoriaHijos ;
    private Map<Integer, Integer> auxNumNode ;
    private int numNode;
    
    @ManagedProperty(value = "#{proyeccionVentasMBean}")
	private ProyeccionVentasMBean proyeccionVentasMBean;
    
	@PostConstruct
	public void init() {
		listaCategoriaPadres = new ArrayList<AvanceCategoriaProductoBean>();
		listaCategoriaHijos = new ArrayList<AvanceCategoriaProductoBean>();
		auxNumNode = new HashMap<Integer, Integer>();
	
		inicializar();
	}
	
	public void inicializar(){
		try {
			numNode=0;
			root = new DefaultTreeNode("Root",null);
			AvanceProyCategoriaProdResponse avanceCategorias = proyeccionCategoriaProductoService.listaCatProdAvance(ObtenerIdTransaccion(), null, proyeccionVentasMBean.getPeriodoDefault());
			listaAvanceCategoriaProductos = new ArrayList<AvanceCategoriaProductoBean>();
			listaCategoriaPadres = new ArrayList<AvanceCategoriaProductoBean>();
			listaCategoriaHijos = new ArrayList<AvanceCategoriaProductoBean>();
			for (AvanceCategoriaProductoBean ls : avanceCategorias.getListaCategoriaProdAvance()) {
				if (ls.getIdPadre() == 0) {
					listaCategoriaPadres.add(ls);
				} else {
					listaCategoriaHijos.add(ls);
				}
			}
			int max = avanceCategorias.getListaCategoriaProdAvance().size();
			if(max > 0){
				node = new TreeNode[max];
				for(AvanceCategoriaProductoBean ls : listaCategoriaPadres){
					node[numNode] = new DefaultTreeNode(ls , root);
					auxNumNode.put(ls.getIdCategoria(), numNode);
					numNode++;
					assignChildren(ls);
				}
			}
		} catch (Exception e) {
			System.out.println("Error al cargar las categorias: " + e);
		}
	}
	 /**
     * Establece los nodos hijos a un árbol menu de forma recursiva.
     *
     * @param father El nodo padre.
     */
	private void assignChildren(AvanceCategoriaProductoBean father) {
		List<AvanceCategoriaProductoBean> children = new ArrayList<AvanceCategoriaProductoBean>();
		children = getMenuByFather(father);
		Iterator<AvanceCategoriaProductoBean> iter = children.iterator();

		while (iter.hasNext()) {
			AvanceCategoriaProductoBean child = iter.next();
			 node[numNode] = new DefaultTreeNode("document", child, node[auxNumNode.get(father.getIdCategoria())]);
			 auxNumNode.put(child.getIdCategoria(), numNode);
	         numNode++;
	         assignChildren(child);
		}
	 }
	 /**
     * Devuelve una lista de nodos según su padre.
     *
     * @param father El nodo padre.
     * @return La lista de nodos.
     */
	private List<AvanceCategoriaProductoBean> getMenuByFather(AvanceCategoriaProductoBean father) {
		
		List<AvanceCategoriaProductoBean> listR = new ArrayList<AvanceCategoriaProductoBean>();
		Iterator<AvanceCategoriaProductoBean> it = listaCategoriaHijos.iterator();
		 while (it.hasNext()) {
			 AvanceCategoriaProductoBean me = it.next();
			 if (me.getIdPadre().intValue() == father.getIdCategoria()) {
	                listR.add(me);
	                it.remove();
	            }
		 }
		return listR;
	}
	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try{
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		}catch(Exception e){
			sessionId="Error";
			System.out.println("Error al obtener Session" + e);
		}
		return sessionId;
	}
	
	public TreeNode getRoot() {
		return root;
	}

	public void setRoot(TreeNode root) {
		this.root = root;
	}

	public TreeNode getSelectedNode() {
		return selectedNode;
	}

	public void setSelectedNode(TreeNode selectedNode) {
		this.selectedNode = selectedNode;
	}

	public List<AvanceCategoriaProductoBean> getListaAvanceCategoriaProductos() {
		return listaAvanceCategoriaProductos;
	}

	public void setListaAvanceCategoriaProductos(
			List<AvanceCategoriaProductoBean> listaAvanceCategoriaProductos) {
		this.listaAvanceCategoriaProductos = listaAvanceCategoriaProductos;
	}

	public ProyeccionVentasMBean getProyeccionVentasMBean() {
		return proyeccionVentasMBean;
	}

	public void setProyeccionVentasMBean(ProyeccionVentasMBean proyeccionVentasMBean) {
		this.proyeccionVentasMBean = proyeccionVentasMBean;
	}
	
}
